Expression & Statement

C++에서 표현식과 문장은 다른 개념이다.
(표현식에 세미클론(‘;’) 추가되면 문장이 됨)
표현식(Expression)
많은 프로그래밍 언어(Python ,R 등)에서는 할당문은 문장이다.
하지만 C++(C, Java 등)에서는 할당문은 표현식으로 문장이 아니다.

따라서 표현식을 다른 할당문 안에서 사용할 수 있다.
ex) x2=x=y+z (할당문은 오른쪽에서 왼쪽으로 수행됨)

함수 호출도 하나의 표현식으로 pow(abs(x), y), abs(x=y) 처럼 중첩해서 사용할 수 있다.

표현식과 달리 문장은 중첩이 불가능함
위와 같은 중첩된 표현식은 가독성이 떨어지며, 유용하기보다 복잡해서 혼란을 가중시킴
문장(Statement)
끝에 세미클론이 오는 표현식을 문장이라고 한다.
하나의 세미클론은 빈 문장을 의미한다.(세미클론을 중첩해서 사용할 수 있음)

일부 문장은 세미클론으로 끝나지 않는다(함수 정의, 중괄호( { } , 복합문; compound Statement) 등)
이와 같은 문장 끝에 세미클론을 추가해도 오류는 발생하지 않지만, 빈 문장으로 인식한다.
분기문
if문
if문을 통해 분기하는 영역은 자신만의 스코프를 가진다.
if(x<0) int absx=-x;
else int absx=x;
//cout<<"|x| is "<<absx<<"\n"; // error absx
if문의 각 분기는 하나의 단일문으로 이루어져 있다. 여러 작업을 수행하기 위해서 중괄호를 사용
double D=q*q/4.0+p*p/27.0;
if(D>0.0){
double z1= ... ;
complex<double> z2= ..., z3= ...;
...
} else if(D==0.0){
double z1= ..., z2= ..., z3= ...;
...
} else {
complex<double> z1= ..., z2= ..., z3= ...;
...
}
if문은 중첩해서 사용할 수 있지만, 각 else문은 마지막에 열린 if 문과 짝을 이룬다.
C++에서 공백은 아무런 영향을 주지 않는다. 하지만 들여쓰기는 프로그램의 구조를 반영해야 한다.
C++와 들여쓰기를 이해하는 에디터들은 자동으로 구조화된 프로그래밍을 하는데 도움을 줌
조건식
조건 ? true일 때의 결과 : false일 때의 결과
if(x<=y) min=y;
else min=y;
//
min= x<=y?x:y
// .
f(a, (x<0?b:c), (y<0?d:e));
switch문
switch문은 특별한 if문으로, 정숫값에 따라 다른 연산을 수행해야 할 때 사용한다.
switch(op_code){
case 0: z=x+y; break;
case 1: z=x-y; cout<<"compute diff\n"; break;
case 2:
case 3: z=x*y; break;
default: z=x/y;
}
case 내에서 break를 사용하지 않으면, 다음 case에 있는 코드도 수행함
while & do-while문
while문은 특정 조건을 만족하는 동안 내용을 반복한다.
//
int x=19;
while(x!=1){
cout<<x<<'\n';
if(x%2==1) x=3*x+1;
else x=x/2;
}
do-while은 while과 동작은 동일하지만, while은 조건을 먼저 검사하는 반면, do-while는 반복할 조건을 끝에 검사한다.
(반복이 적어도 한번은 수행됨)
double eps=0.001;
do{
cout<<"eps = "<<eps<<'\n';
eps/=2.0;
}while(eps>0.0001);
for문
C++에서 가장 많이 사용되는 반복문
double v[3], w[]={2., 4., 6.}, x[]={6., 5., 4};
for(int i=0; i<3; ++i) v[i]=w[i]+x[i];
for(int i=0; i<3; ++i) cout<<"v["<<i<<"] = "<<v[i]<<'\n';
반복문은 세 가지 구성요소로 이루어져 있다.
- 초기화
- 반복 조건
- 반복 작업
위의 예제에서 반복 작업으로 i에 대하여서 사전 증가를 시켰다.
int와 같은 내장 타입에서는 i++와 ++i의 동작에 큰 차이가 없다.
하지만, 사용자 정의 타입의 경우, 사후 증가를 사용하면, 불필요한 복사를 하게 된다.
//Taylor expansion
double x=2.0, xn=1.0, exp_x=1.0;
unsigned long fac=1;
for(unsigned long n=1; n<=10; ++n){
xn*=x;
fac*=n;
exp_x+=xn/fac;
cout<<"e^x is "<<exp_x<<'\n';
}
초기화 부분은 임의의 표현식, 변수 선언, 빈 상태등으로 둘 수 있다.
같은 타입의 변수를 여러 번 선언할 수도 있음

초기화 부분에서 선언한 변수는 반복문 안에서만 보이며, 반복문에서 빠져나오면 사라진다
for(int i=xyz.begin(), end=xyz.end(); i<end; ++i)
반복 조건은 bool 타입으로 변환할 수 있는 임의의 표현식이 될 수 있다.
반복 조건을 비워두면, 항상 true가 되어, 무한 반복문이 됨
반복 작업에서 콤마 연산자를 이용하여, 원하는 만큼 변수를 선언하고, 반복 작업을 진행할 수 있다.
for(int i=0, j=0, p=1; ...; ++i, j+=4, p*=2)
범위 기반 for문(python의 iteration과 같은 문법)
C++11에서 범위 기반 for문이 추가되었다. 이를 이용하면, 반복문을 사용해서 간결하게 표현할 수 있다.
(Java와 동일한 문법)
int primes[]={2, 3, 5, 7, 11, 13, 17, 19};
for(int i: primes)std::cout<<i<<" ";
반복문 제어
continue
break

break는 반복문을 종료하는 키워드이고, continue는 현재 반복에 대해서만 종료하고 다음 반복을 수행하는 키워드이다.
for(...; ...; ...){
...
if(dx==0.0) continue;
...
if(r<eps) break;
...
}
goto
모든 분기문과 반복문은 내부적(어셈블리어)으로 점프(jmp)를 통해서 구현되어 있다.
C++에서 goto와 같은 점프를 제공한다.

C++에서 goto는 C보다 더욱 제한적이며, 프로그램의 구조를 파괴할 위험이 크다.
goto 없이 소프트웨어를 프로그래밍하는 것을 구조적 프로그래밍(Structured Programming)이라고 한다.
int main()
{
int num1=1;
if(num1==1) goto ONE;
else if(num1==2) goto TWO;
else goto EXIT;
ONE:
cout<<"1"<<endl;
goto EXIT;
TWO:
cout<<"2"<<endl;
goto EXIT;
EXIT:
return 0;
}
goto는 사용하지 않는 것이 좋음